package br.unidocs.servico;

import java.util.Calendar;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.eclipse.persistence.config.HintValues;
import org.eclipse.persistence.config.QueryHints;

import br.unidocs.modelo.entidade.Mensagem;
import br.unidocs.modelo.entidade.Usuario;

@Stateless
public class MensagemEJBImpl implements MensagemEJB {

	@PersistenceContext
	EntityManager em;

	@Override
	public List<Mensagem> listarUltimasMensagens(Integer limite) {

		Query query = em
				.createQuery(
						"select m from Mensagem m where m.mensagemPai is null order by m.dataCriacao asc")
				.setHint(QueryHints.REFRESH, HintValues.TRUE);
		if (limite > 0) {
			query.setMaxResults(limite);
		}
		@SuppressWarnings("unchecked")
		List<Mensagem> mensagens = query.getResultList();
		return mensagens;
	}

	@Override
	public Mensagem obterPorId(Integer id) {
		return em.find(Mensagem.class, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Mensagem> listaMensagens() {
		return em.createQuery("select m from Mensagem m order by m.id asc")
				.getResultList(); // m é idem * aqui
	}

	@Override
	public Mensagem gravaTopico(Integer idUsuario, String titulo, String texto) {
		Mensagem msg = new Mensagem();
		msg.setDataCriacao(Calendar.getInstance().getTime());
		msg.setTexto(texto);
		msg.setTitulo(titulo);
		if (idUsuario != null) {
			msg.setUsuario(em.find(Usuario.class, idUsuario));
		}
		em.persist(msg);
		return msg;
	}

	@Override
	public Mensagem gravaResposta(Integer idMensagemOriginal,
			Integer idUsuario, String novoTitulo, String textoResposta) {
		Usuario usuario = null;
		if (idUsuario != null) {
			usuario = em.find(Usuario.class, idUsuario);
		}
		Mensagem mensagemOriginal = em.find(Mensagem.class, idMensagemOriginal);

		// Cria a resposta
		Mensagem resposta = new Mensagem();
		resposta.setDataCriacao(Calendar.getInstance().getTime());
		resposta.setMensagemPai(mensagemOriginal);
		resposta.setTexto(textoResposta);
		resposta.setTitulo(novoTitulo);
		resposta.setUsuario(usuario);

		// persiste a mensagem no banco
		em.persist(resposta);

		return resposta;
	}

	@Override
	public void excluiMensagem(Mensagem m) {
		try {
			// 1 - apaga registro no banco de dados
			// tornando a entidade gerenciada pelo entity manager novamente após
			// uma
			// possível serialização
			if (!em.contains(m)) {
				m = em.find(Mensagem.class, m.getId());
			}
			em.remove(m);
		} catch (Exception e) {
			System.out
					.println("ERRO: Não foi possível apagar a mensagem: " + e);
		}
	}

	@Override
	public void atualizaMensagem(Mensagem mensagem) {
		em.merge(mensagem);

	}

	// @Override
	// public void excluiMensagem(int id) {
	// em.remove(em.find(Mensagem.class, id));
	// }
}
